# -*- coding: utf-8 -*-
# @Time    : 2021/11/16 15:23 
# @Author  : BrandonGT
# @FileName: publish_to_server.py 
# -----------------------------------------------------
# Python 自带Module
import os
import shutil

# Python 第三方Module
import yaml

# Python 自定义Module
from bin.bd_logging import BLogger
from bin.file_handler import check_file_usage, zip_package, create_dir
from bin.file_handler import unzip_package, check_file_exist, check_folder_exist
# -----------------------------------------------------

# ------------------ 定义log ------------------ 开始
CONFIG = os.getcwd()[::-1].split('\\', 1)[-1][::-1] + "\\config\config.yaml"
with open(CONFIG, "r", encoding="utf-8") as content:
    _config = yaml.safe_load(content)
_LOGGER = _config.get("BLogger", {})
_LOGGER_NAME = _LOGGER.get("name", "Default")
_LOGGER_LEVEL = _LOGGER.get("level", 10)
_IS_FILE = _LOGGER.get("file", False)
_FILE_LEVEL = _LOGGER.get("file_level", 0)
_IS_CONSOLE = _LOGGER.get("console", True)
_PATH = _LOGGER.get("path", "D:/")
logger = BLogger(_LOGGER_NAME, level=_LOGGER_LEVEL, file=_IS_FILE, file_level=_FILE_LEVEL, console=_IS_CONSOLE, path=_PATH)
# ------------------ 定义log ------------------ 结束


def publish_to_server():
    """将本地工程目录发布至指定的服务器路径"""
    publish_version = _config.get("Publish").get("version")
    publish_root = _config.get("Publish").get("publish_root")
    pv1, pv2, pv3 = publish_version.split('.')
    version_root = _config.get("Publish").get("version_root")
    if not check_file_exist(version_root):  # 如果不存在版本信息，则根据发行版本号创建verison文件
        generate_version(update_version=True)
    with open(version_root, 'r+') as f:
        version = f.readline()
    vv1, vv2, vv3 = version.split(".")
    if pv1 > vv1 or pv2 > vv2:  # 如果发行版本大于现存版本，则使用新生成的发行版本
        generate_version(update_version=True)
    else:
        generate_version()  # 生成子版本号

    with open(version_root, 'r+') as f:
        version = f.readline()

    publish_root = f"{publish_root}{version}"

    # 清洁模式创建目录
    create_dir(publish_root, clean=True)

    # 生成本地目录的发布压缩包
    zip_file = zip_package()

    # 拷贝压缩包至服务器
    shutil.copy(zip_file, publish_root)
    logger.info(f"压缩包已发布至服务器: {publish_root}")

    # 解压服务器上的压缩包
    unzip_package()  # 等待添加具体需要在服务器解压的文件时再来修改


def open_publish_folder():
    """打开安装目录"""
    target_path = _config.get("Publish").get("publish_root")
    os.startfile(target_path)


def generate_version(update_version=False, compare=False):
    """创建版本信息跟踪文件"""
    version = _config.get("Publish").get("version")
    version_maximum = _config.get("Publish").get("version_maximum")
    version_root = _config.get("Publish").get("version_root")
    version_exist = check_file_exist(version_root)
    if update_version:  # 手动修改版本
        with open(version_root, 'w') as f:
            f.write(version)
            logger.info(f"生成发布版本号：{version}")
    else:  # 创建0.0.X位小数版本，以应对服务器占用无法覆盖的问题
        if version_exist:
            with open(version_root, 'r+') as f:
                version = f.readline()  # 读取文件内的版本信息
            v1, v2, v3 = version.split(".")
            v1 = int(v1)
            v2 = int(v2)
            v3 = int(v3)
            if v3 < version_maximum:
                v3 += 1
            else:
                v3 = 0
                if v2 < version_maximum:
                    v2 += 1
                else:
                    v2 = 0
                    if v1 < version_maximum:
                        v1 += 1
                    else:
                        logger.info("版本已最大化，修改代码了！")
            version = f"{v1}.{v2}.{v3}"
            with open(version_root, 'w+') as f:
                f.write(version)
                logger.info(f"最新的版本为:{version}")
        else: # 如果文件不存在
            with open(version_root, 'w') as f:
                f.write(version)
                logger.info(f"版本信息不存在/内容不正确，创建默认版本号：{version}")


def clear_version():
    """清理本地版本信息和服务器冗余版本文件"""
    version_root = _config.get("Publish").get("version_root")
    publish_root = _config.get("Publish").get("publish_root")
    try:
        os.remove(version_root)
        logger.info("本地版本信息已清除")
    except IOError:
        logger.info(f"无法删除本地版本信息文件：{version_root}")

    try:
        shutil.rmtree(publish_root)
        logger.info("服务器发布路径已清空")
    except IOError:
        logger.info(f"无法删除服务器发布路径：{publish_root}")


if __name__ == '__main__':
    publish_to_server()
    # clear_version()
    open_publish_folder()
    # generate_version()
    # generate_version(update_version=True)
